﻿// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动！任何基于本项目二次开发而产生的一切法律纠纷和责任，我们不承担任何责任！

using Admin.NET.Plugin.MQTT.Option;

using Furion;

using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.Extensions.DependencyInjection;

using MQTTnet.AspNetCore;

namespace Admin.NET.Plugin.MQTT.MQTT;
public static class MqttServerSetup
{
    /// <summary>
    /// 添加mqtt服务
    /// </summary>
    /// <param name="services"></param>
    /// <param name="webHostBuilder"></param>
    public static void AddMqttService(this IServiceCollection services)
    {
        var mqttServerConfig = App.GetConfig<MyMqttServerOptions>("MyMqttServer", true);
        services.Configure<KestrelServerOptions>(serverOptions => {
            //配置Mqtt端口
            serverOptions.ListenAnyIP(mqttServerConfig.MqttPort, options => options.UseMqtt());
            //配置web端口
            serverOptions.ListenAnyIP(mqttServerConfig.MqttWsPort);
        });

        //配置MQTT服务
        services.AddHostedMqttServerWithServices(options =>
        {
            options.WithoutDefaultEndpoint();
            options.WithMaxPendingMessagesPerClient(mqttServerConfig.MaxPendingPerClient);
            options.WithKeepAlive();
        });
        services.AddMqttConnectionHandler();
        services.AddConnections();
        //注入单例mqtt侦听服务
        services.AddSingleton<MyMqttService>();
    }

}
